package com.tgy.algorithm.base;

public class PrintNumBit01 {

    public static void printNumBit(int num, int bitSize) {

        for (int i = bitSize - 1; i >= 0; i--) {
           String val = (num & (1 << i)) == 0 ? "0":"1";
           System.out.print(val);
        }
        System.out.println();
    }

    public static void test01() {
        //        printNumBit(-500, Integer.SIZE);
        printNumBit(-5, Integer.SIZE);
//        >>> 无符号位移，在最前一位添加0，无论符号位是什么
        printNumBit(-5 >>> 1, Integer.SIZE);
        // >> 有符合位移，在最前一位添加符号位
        printNumBit(-5 >> 1, Integer.SIZE);
    }

    public static void test02() {
        int a = -6;
        // 取相反数
        System.out.println(~a + 1);
        int b = 2;
//        2*b + 1 = b << 1 | 1
        System.out.println((b << 1) | 1 );
    }

    public static int findLastBitZero(int num) {
        return num & ((~num) + 1);
    }

    // 获取二进制位上有多少个1
    public static int findNumOneCount(int num) {

        int count = 0;
        while (num != 0) {
            int last = num & ((~num) + 1);
            num = num ^ last;
            count++;
        }
        return count;
    }

    // 一堆数中有两个数的数量是奇数，其他是偶数，找出这两个数
    public static void findOddNumber(int[] nums) {

        int base01 = 0;
        for(int num : nums) {
            base01 ^= num;
        }

        // base01 就是出现两个数的^值
        // 获取base01最右一位1位置的值
        int tmp = base01 & ((~base01) + 1);
        System.out.println(tmp);

        int one = 0;
        for(int num : nums) {
            if((num & tmp) == 0) {
                one ^= num;
            }
        }

        System.out.println(one + " " + (one ^ base01));
    }

    public static void main(String[] args) {
//        test02();
//        printNumBit(5, Integer.SIZE);
//        int val = findLastBitZero(20);
//        printNumBit(20,Integer.SIZE);
//        printNumBit(val, Integer.SIZE);
//        int num = 14;
//        int result = findNumOneCount(14);
//        printNumBit(num, Integer.SIZE);
//        System.out.println(result);
        findOddNumber(new int[]{2,2,2,3,3,4,4,5,5,5});
    }

}
